/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SintaticoPacote;

import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Fernanda
 */
public class ExpAtribuicaoFor {

    chamadaDeFuncao chamadaFuncao;


    public boolean sintaxeExpAtribuicaoFor(TabelaSimbolos tabelaSimbolos) {

        if (tabelaSimbolos.getLookahead().equals("int")) {
            if (tabelaSimbolos.reconhecer("int")) {
            }
        }
        else if(ehIdentificador(tabelaSimbolos) && tabelaSimbolos.superTipo(1).equals("identificador")){
            tabelaSimbolos.soConsome();
        }
        
        if(ehIdentificador(tabelaSimbolos)){
            tabelaSimbolos.soConsome();
            if(tabelaSimbolos.reconhecer("=")){

                if(verificaPosIgual(tabelaSimbolos)){


                    if(ehIdentificador(tabelaSimbolos)){
                        if(tabelaSimbolos.superLookahead(1).equals(";")){
                            tabelaSimbolos.soConsome();
                        }
                        else if(tabelaSimbolos.superLookahead(1).equals("(")){
                            chamadaFuncao = new chamadaDeFuncao(tabelaSimbolos);
                            if(chamadaFuncao.chamaFuncao()){

                            }else{
                                 ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                return false; }//chamada de funcao mal formada
                        }
                        else{
                             ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                          return false;//depois do identificador, não veio nem ; nem (
                        }
                           
                    }

                    else if (ehNumero(tabelaSimbolos) && tabelaSimbolos.superLookahead(1).equals(";")){
                        tabelaSimbolos.soConsome();
                    }


                    else if(verificaExpAritmetica(tabelaSimbolos)){

                        if(ExpressaoAritmetica.expAritmetica(tabelaSimbolos)){

                        }else{
                             ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                          return false;//depois do identificador, não veio nem ; nem (
                        } //expressao aritmetica mal formada
                    }


                }else{
                             ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                          return false;//depois do identificador, não veio nem ; nem (
                        }//nao encontrou nenhum dos possíveis simbolos depois da igualdade
            }
            else{
                             ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                          return false;//depois do identificador, não veio nem ; nem (
                        }//encontrou um identificador, mas não encontrou igual

        }else{
                             ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                          return false;//depois do identificador, não veio nem ; nem (
                        }//se nao encontrou ao menos um identificador





        return true;
    }


        public boolean ehIdentificador(TabelaSimbolos tabelaSimbolos) {
        if (tabelaSimbolos.getTipo().equals("identificador")) {
            return true;
        } else {
            return false;
        }
    }
        
       public boolean ehNumero(TabelaSimbolos tabelaSimbolos) {
        if (tabelaSimbolos.getTipo().equals("numero")) {
            return true;
        } else {
            return false;
        }
    }


    public boolean verificaExpAritmetica(TabelaSimbolos tabelaSimbolos) {

        if (tabelaSimbolos.getTipo().equals("identificador") || tabelaSimbolos.getTipo().equals("numero") ||
                tabelaSimbolos.getLookahead().equals("(")) {
            return true;
        } else {
            return false;
        }
    }


        public boolean verificaPosIgual(TabelaSimbolos tabelaSimbolos){
            if(ehIdentificador(tabelaSimbolos)|| ehNumero(tabelaSimbolos)|| verificaExpAritmetica(tabelaSimbolos))
                return true;
            else
                return false;
        }
}
